
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ModeloLogicoSistema;

import com.itextpdf.text.BaseColor;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.Font;
import com.itextpdf.text.Rectangle;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author carlos
 */
public class ImprimirListadoPlanchadoPendiente {

    private File ruta_destino = null;
    private AdministradorOrden adm;
    PdfPTable tabla_principal = new PdfPTable(1);
    Document mipdf;
    private FileOutputStream outputStream;
    private String orden = null;
    private ArrayList<ServicioContratado> servicios = new ArrayList();
    private String nombreS;
    private String cantidad;
    private String codServicio;

    public ImprimirListadoPlanchadoPendiente(String fechaPautada) throws FileNotFoundException, DocumentException, Exception {

        this.adm = new AdministradorOrden();

        ArrayList<Orden> ordenes = this.adm.ordenesPlanchadoPendiente(fechaPautada);



        if (!this.Colocar_Destino()) {
            return;
        }

        FileOutputStream outputStream = new FileOutputStream(this.ruta_destino + ".pdf");


        this.tabla_principal.setWidthPercentage(100); //modificamos el ancho de la celda principal


        mipdf = new Document();
        PdfWriter.getInstance(mipdf, outputStream);

        this.tabla_principal.addCell(this.fila1_EncabezadoPlanchados());

        this.servicios = new ArrayList();
        boolean hayPlanchados=false;
        for (Orden orden : ordenes) {

            this.orden = orden.getCodOrden().toString();


            this.servicios = (ArrayList<ServicioContratado>) this.adm.mostrarServiciosPlanchadoPendiente(orden.getCodOrden());
            if(!servicios.isEmpty()){
                hayPlanchados=true;
                this.tabla_principal.addCell(this.getFila2Orden());

                //this.servicios = (ArrayList<ServicioContratado>) this.adm.mostrarServiciosPlanchadoPendiente(orden.getCodOrden());

                
                ArrayList<String> nombresServicio = new ArrayList<String>();
                ArrayList<String> coigoServicio = new ArrayList<String>();
                ArrayList<String> cantidadServicio = new ArrayList<String>();


                for (ServicioContratado servicio : servicios) {


                    nombresServicio.add(servicio.getNombre());
                    cantidadServicio.add(servicio.getCantidad().toString());
                    coigoServicio.add(servicio.getCodServicio().toString());

                }
                this.tabla_principal.addCell(this.CeldaDatosServicios(coigoServicio, nombresServicio, cantidadServicio));
            }
        }
        if(hayPlanchados)
            this.CrearTicket();
        else{
            JOptionPane.showMessageDialog(null,"Lo sentimos no existen servicios de planchados en las ordenes pendientes para la fecha indicada");
        }

    }

    public PdfPCell fila1_EncabezadoPlanchados() {

        String encabezado = "La Burbuja\nListadoPlanchado ";
        Font fuente1 = new Font(Font.getFamily("ARIAL"), 11, Font.BOLD);
        Paragraph linea = new Paragraph(encabezado, fuente1);                   // creo el encabezado    
        linea.setAlignment(Paragraph.ALIGN_CENTER);

        PdfPCell celda = new PdfPCell();                     // creo la celda 
        celda.setFixedHeight(35);                           // modifica la altura de una celda                

        celda.addElement(linea);

        return celda;
    }

    private PdfPCell getFila2Orden() {
        PdfPCell cell = new PdfPCell(new Paragraph(" Orden " + this.orden + "", FontFactory.getFont("arial", 10, Font.BOLD, BaseColor.BLACK)));
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setBorder(Rectangle.NO_BORDER);

        return cell;
    }

    private PdfPCell getFila3CodigoServicio() {

        PdfPCell cell = new PdfPCell(new Paragraph(" Código ", FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK)));
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setBorder(Rectangle.NO_BORDER);

        return cell;
    }

    private PdfPTable getFila3CodigoServicioDatos(ArrayList<String> c) throws DocumentException, IOException {

        PdfPTable tabla = new PdfPTable(1);

        for (Integer i = 0; i < c.size(); i++) {

            tabla.addCell(this.getCell(c.get(i)));
        }
        return tabla;
    }

    private PdfPCell getFila3NombreServicio() {

        PdfPCell cell = new PdfPCell(new Paragraph(" Servicio ", FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK)));
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setBorder(Rectangle.NO_BORDER);

        return cell;
    }

    private PdfPTable getFila3NombreServicioDatos(ArrayList<String> c) throws DocumentException, IOException {

        PdfPTable tabla = new PdfPTable(1);

        for (Integer i = 0; i < c.size(); i++) {

            tabla.addCell(this.getCell(c.get(i)));
        }
        return tabla;
    }

    private PdfPCell getFila3cantidad() {

        PdfPCell cell = new PdfPCell(new Paragraph(" Cantidad ", FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK)));
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setBorder(Rectangle.NO_BORDER);

        return cell;

    }

    private PdfPTable getFila3cantidadDatos(ArrayList<String> c) throws DocumentException, IOException {

        PdfPTable tabla = new PdfPTable(1);

        for (Integer i = 0; i < c.size(); i++) {

            tabla.addCell(this.getCell(c.get(i)));
        }
        return tabla;
    }

    private PdfPCell getCell(String text) throws DocumentException, IOException {

        PdfPCell cell = new PdfPCell(new Paragraph("" + text + "", FontFactory.getFont("arial", 8, Font.BOLD, BaseColor.BLACK)));
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setBorder(Rectangle.NO_BORDER);
        return cell;
    }

    public PdfPTable CeldaDatosServicios(ArrayList<String> cod, ArrayList<String> nom, ArrayList<String> cant) throws DocumentException, IOException {

        float[] widths = {19, 68, 32};
        PdfPTable tabla = new PdfPTable(widths);

        tabla.addCell(getFila3CodigoServicio());
        tabla.addCell(getFila3NombreServicio());
        tabla.addCell(getFila3cantidad());

        tabla.addCell(getFila3CodigoServicioDatos(cod));
        tabla.addCell(getFila3NombreServicioDatos(nom));
        tabla.addCell(getFila3cantidadDatos(cant));

        return tabla;
    }

    public void CrearTicket() throws DocumentException {

        this.mipdf.open();

        this.mipdf.add(this.tabla_principal);

        mipdf.close();




        byte[] c;
        c = mipdf.toString().getBytes();

        JOptionPane.showMessageDialog(null,
                "Listado de planchados enviandose a imprimir ....");


        try {

            outputStream = new FileOutputStream(ruta_destino);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

        DocFlavor docFormat = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        Doc document = new SimpleDoc(c, docFormat, null);
        PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet(); /// jajaja
        PrintService defaultPrintService = PrintServiceLookup
                .lookupDefaultPrintService();
        System.out.println("Nombre impresora por defecto: "
                + defaultPrintService.getName());
        if (defaultPrintService != null) {

            DocPrintJob printJob = defaultPrintService.createPrintJob();

            try {

                printJob.print(document, attributeSet);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }
    }


    /* public void Colocar_Destino() {
     FileNameExtensionFilter filter = new FileNameExtensionFilter(
     "Archivo PDF", "pdf", "PDF");
     JFileChooser fileChooser = new JFileChooser();
     fileChooser.setFileFilter(filter);
     fileChooser.setSelectedFile(new File("Ticket"+orden));
     int result = fileChooser.showSaveDialog(null);
     }*/
    public static String getFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
        return formateador.format(ahora);
    }

    public boolean Colocar_Destino() {
        boolean retorno = false;
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "Archivo PDF", "pdf", "PDF");
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(filter);
        fileChooser.setSelectedFile(new File("Listado Planchado " + this.getFechaActual()));
        int result = fileChooser.showSaveDialog(null);


        if (result == JFileChooser.APPROVE_OPTION) {
            this.ruta_destino = fileChooser.getSelectedFile().getAbsoluteFile();
            retorno = true;
        } else {
            JOptionPane.showMessageDialog(null, "No se ha concretado la impresión.");
        }
        return retorno;
    }
}